flowchart TD
    A[开始] --> B[接收POST请求]
    B --> C[获取请求参数:courseList,pay_method,use_coupon,use_coupon_id,total_price,real_price]
    C --> D[记录日志:前端传递参数信息]
    D --> E{"courseList是否为空?"}
    E -->|是| F[记录错误日志:课程列表不能为空]
    F --> G[返回响应:课程列表不能为空]
    E -->|否| H[获取user_id=request.user.id]
    H --> I[提取course_ids=[item.course_id for item in course_list]]
    I --> J[记录日志:用户购物车课程列表id]
    J --> K[获取Redis连接:redis_conn=get_redis_connection]
    K --> L[构造cart_key="code_env_spaces:carts:cartList:user_id"]
    
    L --> M[遍历course_ids中的每个course_id]
    M --> N[构造course_key="course_course_id"]
    N --> O[从Redis获取购物车项:cart_item=redis_conn.hget]
    O --> P{"cart_item是否存在?"}
    P -->|否| Q[记录错误日志:用户购物车中不存在课程]
    Q --> R[返回响应:课程不存在]
    P -->|是| S[解码并解析购物车项:json.loads]
    S --> T[记录日志:用户购物车中课程信息]
    T --> U{"cart_item.is_selected是否为0?"}
    U -->|是| V[记录错误日志:课程未选中]
    V --> W[返回响应:课程未选中]
    U -->|否| X[继续处理下一个课程]
    
    M --> Y{"是否遍历完所有course_id?"}
    Y -->|否| N
    Y -->|是| Z[查询数据库课程:Course.objects.filter]
    Z --> AA[记录日志:数据库课程信息]
    AA --> AB{"数据库课程数量等于请求课程数量?"}
    AB -->|否| AC[记录错误日志:存在未上架课程]
    AC --> AD[返回响应:存在未上架的课程]
    AB -->|是| AE[初始化calculate_total=0]
    
    AE --> AF[遍历course_list中的每个item]
    AF --> AG[提取item参数:course_id,expire_time,price]
    AG --> AH{"expire_time是否等于0?"}
    AH -->|是| AI[查询永久课程价格:Course.objects.get]
    AH -->|否| AJ[查询有效期课程价格:CourseExpire.objects.get]
    AI --> AK[记录日志:课程永久有效价格]
    AJ --> AK
    AK --> AL[calculate_total += course_price]
    AL --> AM{"price是否等于course_price?"}
    AM -->|否| AN[记录错误日志:课程价格有误]
    AN --> AO[记录错误日志:前端价格与数据库价格对比]
    AO --> AP[返回响应:价格有误]
    AM -->|是| AQ
    
    AF --> AQ{"是否遍历完所有item?"}
    AQ -->|否| AF
    AQ -->|是| AR{"total_price是否等于calculate_total?"}
    AR -->|否| AS[记录错误日志:总价格不一致]
    AS --> AT[返回响应:订单总价格有误]
    AR -->|是| AU[获取雪花算法实例:SnowflakeSingleton.get_instance]
    AU --> AV[生成订单编号:snowflake.get_id]
    AV --> AW[记录日志:生成订单编号]
    AW --> AX[开启数据库事务:transaction.atomic]
    AX --> AY[创建订单:Order.objects.create]
    AY --> AZ[记录日志:创建订单表成功]
    
    AZ --> BA[遍历course_list中的每个item]
    BA --> BB[提取item参数:course_id,expire_days,expire_text,price]
    BB --> BC[记录日志:正在创建订单详情表]
    BC --> BD{"expire_days是否不等于0?"}
    BD -->|是| BE[计算过期时间:timezone.now+timedelta]
    BD -->|否| BF[expire_time=None]
    BE --> BG
    BF --> BG
    BG --> BH[创建订单详情:OrderDetail.objects.create]
    BH --> BI[记录日志:正在创建的订单详情]
    BA --> BJ{"是否遍历完所有item?"}
    BJ -->|否| BA
    BJ -->|是| BK[提交事务]
    
    BK --> BL[遍历course_ids中的每个course_id]
    BL --> BM[构造course_key="course_course_id"]
    BM --> BN[从购物车删除:hdel]
    BL --> BO{"是否遍历完所有course_id?"}
    BO -->|否| BL
    BO -->|是| BP[返回响应:订单创建成功]
    
    BP --> BQ[结束]
    G --> BQ
    R --> BQ
    W --> BQ
    AD --> BQ
    AP --> BQ
    AT --> BQ
    
    BR[捕获异常Exception]
    BR --> BS[记录错误日志:订单创建失败]
    BS --> BT[返回响应:订单创建失败]
    BT --> BQ
    
    AX --> BR
